﻿/**
 * 向指定日期添加“年”
 * @name Date.addYears
 * @function
 * @type Date
 * @grammar Date.addYears(num)
 * @param {Number} num 添加的年数
 * @memberOf Date#

 * @example
 * var dtm = new Date("01/12/2008");
 * dtm.addYears(1);
 * dtm.toString();
 * @result Mon Jan 12 2009 00:00:00
 * 
 * @returns {Date} 添加年数后的日期
 */
if (!Date.prototype.addYears) Date.prototype.addYears = function(num) {
  this.setFullYear(this.getFullYear() + num);
  return this;
};
  
/**
 * 向指定日期添加“月”
 * @name Date.addMonths
 * @function
 * @type Date
 * @grammar Date.addMonths(num)
 * @param {Number} num 添加的月数
 * @memberOf Date#
 * 
 * @example var dtm = new Date("01/12/2008");
 * dtm.addMonths(1);
 * dtm.toString();
 * @result Tue Feb 12 2008 00:00:00
 * 
 * @returns {Date} 添加月数后的日期
 */
if (!Date.prototype.addMonths) Date.prototype.addMonths = function(num) {
  var tmpdtm = this.getDate();
  this.setMonth(this.getMonth() + num);
  if (tmpdtm > this.getDate()) this.addDays(-this.getDate());
  return this;
};
  
/**
 * 向指定日期添加“日”
 * @name Date.addDays
 * @function
 * @type Date
 * @grammar Date.addDays(num)
 * @param {Number} num 添加的日数
 * @memberOf Date#
 * 
 * @example var dtm = new Date("01/12/2008");
 * dtm.addDays(1);
 * dtm.toString();
 * @result Sun Jan 13 2008 00:00:00
 * 
 * @returns {Date} 添加日数后的日期
 */
if (!Date.prototype.addDays) Date.prototype.addDays = function(num) {
  this.setTime(this.getTime() + (num*86400000) );
  return this;
};

/**
 * 向指定日期添加“小时”
 * @name Date.addHours
 * @function
 * @type Date
 * @grammar Date.addHours(num)
 * @param {Number} num 添加的小时数
 * @memberOf Date#
 * 
 * @example var dtm = new Date("01/12/2008");
 * dtm.addHours(1);
 * dtm.toString();
 * @result Sun Jan 13 2008 00:00:00
 * 
 * @returns {Date} 添加小时数后的日期
 */
if (!Date.prototype.addHours) Date.prototype.addHours = function(num) {
  this.setHours(this.getHours() + num);
  return this;
};

/**
 * 向指定日期添加“分钟”
 * @name Date.addMinutes
 * @function
 * @type Date
 * @grammar Date.addMinutes(num)
 * @param {Number} num 添加的分钟数
 * @memberOf Date#
 * 
 * @example var dtm = new Date("01/12/2008");
 * dtm.addMinutes(1);
 * dtm.toString();
 * @result Sat Jan 12 2008 01:00:00
 * 
 * @returns {Date} 添加分钟数后的日期
 */
if (!Date.prototype.addMinutes) Date.prototype.addMinutes = function(num) {
  this.setMinutes(this.getMinutes() + num);
  return this;
};

/**
 * 向指定日期添加“秒”
 * @name Date.addSeconds
 * @function
 * @type Date
 * @grammar Date.addSeconds(num)
 * @param {Number} num 添加的秒数
 * @memberOf Date#
 * 
 * @example var dtm = new Date("01/12/2008");
 * dtm.addSeconds(60);
 * dtm.toString();
 * @result Sat Jan 12 2008 00:01:00
 * 
 * @returns {Date} 添加秒数后的日期
 */
if (!Date.prototype.addSeconds) Date.prototype.addSeconds = function(num) {
  this.setSeconds(this.getSeconds() + num);
  return this;
};

/**
 * 对目标日期对象进行格式化
 * @name Date.format
 * @function
 * @type Date
 * @grammar Date.format(pattern)
 * @param {string} pattern 日期格式化规则
 * @remark
 * 
    格式表达式，变量含义：
    hh: 带 0 补齐的两位 12 进制时表示
    h: 不带 0 补齐的 12 进制时表示
    HH: 带 0 补齐的两位 24 进制时表示
    H: 不带 0 补齐的 24 进制时表示
    mm: 带 0 补齐两位分表示
    m: 不带 0 补齐分表示
    ss: 带 0 补齐两位秒表示
    s: 不带 0 补齐秒表示
    yyyy: 带 0 补齐的四位年表示
    yy: 带 0 补齐的两位年表示
    MM: 带 0 补齐的两位月表示
    M: 不带 0 补齐的月表示
    dd: 带 0 补齐的两位日表示
    d: 不带 0 补齐的日表示
 * @memberOf Date#
 * 
 * @returns {string} 格式化后的字符串
 */
if (!Date.prototype.format) Date.prototype.format = function(pattern) {
  pattern = pattern || "yyyy-MM-dd HH:mm:ss";
  function replacer(patternPart, result) {
    pattern = pattern.replace(patternPart, result);
  }
  var _zeroPad = function(source, length) {
      var pre = "",
          negative = (source < 0),
          string = String(Math.abs(source));
      if (string.length < length) {
        pre = (new Array(length - string.length + 1)).join('0');
      }
      return (negative ?  "-" : "") + pre + string;
    },
    year = this.getFullYear(),
    month = this.getMonth() + 1,
    date2 = this.getDate(),
    hours = this.getHours(),
    minutes = this.getMinutes(),
    seconds = this.getSeconds();
  replacer(/yyyy/g, _zeroPad(year, 4));
  replacer(/yy/g, _zeroPad(parseInt(year.toString().slice(2), 10), 2));
  replacer(/MM/g, _zeroPad(month, 2));
  replacer(/M/g, month);
  replacer(/dd/g, _zeroPad(date2, 2));
  replacer(/d/g, date2);
  replacer(/HH/g, _zeroPad(hours, 2));
  replacer(/H/g, hours);
  replacer(/hh/g, _zeroPad(hours % 12, 2));
  replacer(/h/g, hours % 12);
  replacer(/mm/g, _zeroPad(minutes, 2));
  replacer(/m/g, minutes);
  replacer(/ss/g, _zeroPad(seconds, 2));
  replacer(/s/g, seconds);
  return pattern;
};